---
title: 容器化的应用
description: 如何创建并运行容器？
---
## 什么是容器化应用
运行容器的时候，并不是从零开始的，而是要先拉取一个 **镜像（image）**,在从这个镜像来启动容器。
```bash
docker pull busybox
docker run busybox echo hello world
```
从功能上看，镜像和常见的 tar、rpm、deb等安装包一样，都打包了应用程序，**但最大的特点在于它里面不仅有基本的可执行文件，还有应用运行时的整个系统环境。这就让镜像具有了非常好的跨平台便携性和兼容性**
这是一种更高级的应用打包方式。

`docker pull busybox` 就是获取了一个打包了 busybox 应用的镜像，里面包含了 busybox 程序和它所需的运行环境。

`docker run busybox echo hello world` 就是提取镜像里的各种信息，利用 `namespace`、`cgroup`、`chroot` 技术创建出隔离环境，然后再运行 busybox 的 echo 命令。

这两个步骤，由于是基于标准的 Linux 系统调用和只读的镜像文件，所以，无论是在那种操作系统上，都会得到完全一致的结果。

任何应用都可以通过这种方式打包再分发再运行，一次编写、到处运行。

**所谓的容器化的应用（应用的容器化），就是指应用程序不直接和操作系统打交道，而是封装成镜像，再交给容器环境去运行。**

镜像就是静态的应用容器，容器就是动态的应用镜像，这这互相依存，互相转化。Docker 的核心处理对象就是镜像(image)和容器(container).
## 常见的镜像操作有哪些
 `docker pull` 从远端仓库拉取代码

**镜像的完整名字由两个部分组成，名字和标签，中间用 : 连接起来**

名字表面了应用的身份，比如 busybox、Nginx、Redis 等等。标签(tag) 则可以理解为区分不同版本而做的标记，任何字符串都可以。其中有一个比较特殊的标签叫做 latest，它是默认的标签，如果只提供名字没有附带标签，那么就会使用这个默认的标签。

```bash
docker pull alpint:3.15
docker pull ubuntu:jammy
docker pull nginx:1.21-alpine
docker pull nginx:alpine
docker pull redis
```
有了这些镜像之后，可以使用 `docker images` 命令来查看它们的具体信息：

![img](https://img.wkq.pub/img/3c6e24139acc6d791c189879a7608c00.png)



* `REPOSITORY` 列是镜像的名字
* `TAG` 是镜像的标签
* `IMAGE ID` 是镜像的唯一标识，十六进制，和 `REPOSITORY` 一一对应。

`docker rmi ` 命令用来删除镜像，`rmi` 是 `remove image` 的简写。

```bash
docker rmi redis
```

| 镜像操作命令    | 作用及常用参数         |
| --------------- | ---------------------- |
| `docker pull`   | 从远端仓库拉取镜像     |
| `docker images` | 列出当前本地已有的镜像 |
| `docker rmi `   | 删除镜像               |

## 常用的容器操作

`docker run `命令把静态的应用运行起来，变成动态的容器，基本的格式是 **docker run 设置参数**，再跟上 **镜像名或 ID**，后面还可能会有附加的运行命令。

```bash
docker run -h srv alpine hostname
```

`-h srv` 是容器的运行参数，`alpine` 是镜像名 , `hostname ` 表示要在容器里运行 `hostname` 这个程序，输出主机名.

`docker run ` 是最复杂的一个容器操作命令，有非常多的额外参数来调整容器的运行状态，可以使用 `--help` 查看它的帮助信息。

`-it` 表示开启一个交互式操作的 shell，这样可以直接进入容器内部，就好像是登录虚拟机一样。（实际上是 `-i` 和 `-t`两个参数的组合形式） 。

`-d` 表示让容器在后台运行。

`--name` 为容器起一个名字，方便查看。

对于正在运行中的容器，可以使用 `docker exec` 命令在里面执行另一个程序，效果和 `docker run `很类似，最常见的用法是 使用`-it`  参数打开一个 Shell，从而进入容器内部。

```bash
docker exec -it redis sh
```

运行中的容器可以使用 docker stop 命令来强制停止。

```bash
docker stop redis
```

容器停止后，使用 `docker ps` 命令就看不到了，不过容器并没有被销毁，还可以使用 `docker ps -a` 命令查看系统里所有的容器，当然也包括已经停止运行的容器。

这些停止运行的容器可以使用 `docker start `再次启动运行。

如果不需要了，可以使用 `docker rm`命令来彻底 删除，加上 `-f`参数表示强制删除。

在执行 `docker run` 的时候可以加上一个 `--rm` 参数，告诉 Docker 不保存容器，只要运行完毕就自动清除。

| 容器操作命令 | 作用及常用参数                                               |
| ------------ | ------------------------------------------------------------ |
| docker run   | 从镜像启动容器，及运行容器化应用 <br/> 常用参数 <br/> `it`: 开启一个交互式操作的 Shell <br/> `-d`： 让容器在后台运行 <br/> `--name`: 给容器起一个名字 <br/> `--rm`: 不保存容器，运行完毕自动删除 |
| docker ps    | 列出正在运行的容器                                           |
| docker exec  | 在容器里运行另一个程序                                       |
| docker stop  | 强制停止容器                                                 |
| docker start | 再次启动已经停止的容器                                       |
| docker rm    | 彻底删除容器                                                 |

